#coding:utf8
#1.您的自定义存储系统必须是以下子类 django.core.files.storage.Storage
from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
from django.conf import settings
from django.utils.deconstruct import deconstructible
# 4. 您的存储类必须是可解构的， 以便在迁移中的字段上使用时可以对其进行序列化。
# 只要您的字段具有可自行序列化的参数，就
# 可以使用 django.utils.deconstruct.deconstructible类装饰器
# （这就是Django在FileSystemStorage上使用的）。

@deconstructible
class MyStorage(Storage):

    #2.Django必须能够在没有任何参数的情况下实例化您的存储系统。
    # 这意味着任何设置都应该来自django.conf.settings
    def __init__(self, client_path=None,ip=None):

        if client_path is None:
            self.client_path = settings.FDFS_CLIENT_CONF

        if ip is None:
            self.ip = settings.FDFS_URL


    # 3. 您的存储类必须实现_open()和_save() 方法以及适用于您的存储类的任何其他方法
    # 3.1 open 方法是打开文件的方法
    # 我们是采用的 fastdfs 的storage实现的文件 下载 所以 不需要此方法
    def _open(self, name, mode='rb'):
        pass

    #3.2 我们需要自己 实现 fastdfs 的文件上传
    def _save(self, name, content, max_length=None):

        # I 获取上传的内容
        # content 上传的内容
        file_data = content.read()

        # II   通过fdfs 上传
        # client = Fdfs_client(settings.FDFS_CLIENT_CONF)
        client = Fdfs_client(self.client_path)
        # buffer 二进制流
        # 我们通过 content.read() 获取到文件的内容
        result = client.upload_by_buffer(file_data)


        # III 判断上传结果 , 返回
        #{'Status': 'Upload successed.', 'Group name': 'group1',
        # 'Uploaded size': '31.00KB', 'Storage IP': '192.168.229.133',
        #  'Remote file_id': 'group1/M00/00/02/wKjlhVtFY_yAcOFLAAB9AY9TCZE763.jpg', 'Local file name': '/home/python/Desktop/images/3.jpg'}

        if result.get('Status') == 'Upload successed.':
            #说明上传成功
            return result.get('Remote file_id')
        else:
            raise Exception('上传失败')


    # 我们采用的是 FDFS 它有自己的文件存储系统,如果上传相同的文件
    # 它是可以进行 不重名处理,所以您就尽管上传图片,不会覆盖
    def exists(self, name):

        return False

    # 返回文件的内容
    def url(self, name):
        # name 就是 我们通过文件上传的 'Remote file_id': 'group1/M00/00/02/wKjlhVtFY_yAcOFLAAB9AY9TCZE763.jpg'
        # group1/M00/00/02/wKjlhVtFY_yAcOFLAAB9AY9TCZE763.jpg

        return self.ip +  name
        return settings.FDFS_URL +  name
        return 'http://192.168.229.133:8888/' +  name
